﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Linq;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Transactions;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using ShopNet.Model;
using ShopNet.Util;

namespace ShopNet
{
    public partial class Shop : System.Web.UI.MasterPage
    {
        #region Propriedades

        public int TotalRegs { get; set; }
        private int tamPagina = ConfigurationManager.AppSettings["TotalProdPorPagina"] == null ? 10 : int.Parse(ConfigurationManager.AppSettings["TotalProdPorPagina"]);
        public int TamPagina
        {
            get { return tamPagina; }
            set { tamPagina = value; }
        }

        public int PaginaAtual
        {
            get { return (int)(ViewState["PaginaAtual"] ?? 1); }
            set { ViewState.Add("PaginaAtual", value); }
        }
        public int TotalPaginas
        {
            get
            {
                int totalPaginas = TotalRegs / tamPagina;
                if ((totalPaginas % tamPagina) > 0)
                    totalPaginas++;
                return totalPaginas;
            }
        }

        public HtmlGenericControl SpamMensagem
        {
            get { return spamMensagem; }
        }

        public IList<Categoria> Categorias
        {
            get
            {
                if (Session["Categorias"] == null)
                {
                    var lista = NServico.Db.Categorias.ToList();
                    Session.Add("Categorias", lista);

                }
                return (IList<Categoria>)Session["Categorias"];
            }
        }
        #endregion

        #region Enumaradores

        public enum TipoMensagem
        {
            Info,
            Warning,
            Error,
            Success
        }

        #endregion

        #region Eventos

        protected void Page_Load(object sender, EventArgs e)
        {
            
            if (!IsPostBack)
            {
                CarregarMenu();
                CarregarProdutosPromocoes();
            }
        }

        #endregion

        #region Metodos

        #region ExibirMensagem

        public void ExibirMensagem(TipoMensagem tipoMensagem, string mensagem)
        {
            if (string.IsNullOrWhiteSpace(mensagem))
            {
                SpamMensagem.Attributes.Remove("class");
                SpamMensagem.Visible = false;
                return;
            }
            SpamMensagem.Visible = true;
            SpamMensagem.Attributes.Remove("class");
            SpamMensagem.Attributes.Add("class", string.Format("form-msg-{0}", tipoMensagem.ToString().ToLower()));
            //SpamMensagem.InnerText = mensagem;
            lMensagem.Text = mensagem;

        }

        public void ExibirMensagem(TipoMensagem tipoMensagem, IList<string> mensagens)
        {
            #region Exibir mensagem

            if (mensagens.Count > 0)
            {
                StringBuilder sb = new StringBuilder(string.Empty);
                foreach (string msg in mensagens)
                {
                    sb.AppendFormat("<li>{0}</li>", msg);
                }
                string msgfinal = string.Format("<ul>{0}</ul>", sb);
                ExibirMensagem(TipoMensagem.Error, msgfinal);
                return;
            }

            #endregion

        }

        #endregion

        #region CarregarMenu

        private void CarregarMenu()
        {
            rMenu.DataSource = Categorias;
            rMenu.DataBind();
        }

        #endregion

        #region CarregarProdutosPromocoes

        private void CarregarProdutosPromocoes()
        {
            PaginaAtual = int.Parse(Request.QueryString["Pagina"] ?? "1");
            /*IQueryable<Produto> lista;
            if (Session["listaDefault"] == null)
            {
                lista = NServico.Db.Produtos.Where(p => p.Destaque);
                Session.Add("listaDefault", lista);
            }
            else
                lista = Session["listaDefault"] as IQueryable<Produto>;

            TotalRegs = lista.Count();
            //lista = lista.Pagina(PaginaAtual, TamPagina, p => p.Nome, true);
            */

            IList<Produto> lista;

            if (Session["listaDefault"] == null)
            {
                lista = NServico.Db.Produtos.Where(p => p.Destaque).Pagina(1, TamPagina, p => p.Nome, true).ToList();
            }
            else
            {
                lista = Session["listaDefault"] as IList<Produto>;
            }

            rPromocoes.DataSource = lista; 
            rPromocoes.DataBind();

        }

        #endregion

        #region GetQtdeProdChart

        public int GetQtdeProdChart()
        {
            if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());
            var lista = (IList<ProdutoCarrinho>)Session["cesta"];
            return lista.Count();
        }
        
        #endregion

        #region GetValorTotalProdCesta

        public string GetValorTotalProdCesta()
        {
            if (Session["cesta"] == null) Session.Add("cesta", new List<ProdutoCarrinho>());
            var lista = (IList<ProdutoCarrinho>)Session["cesta"];
            return lista.Sum(p => p.Valor).ToString("#,##0.00");
        }

        #endregion

        #region GetUrlProdPrincipal

        public string GetUrlProdPrincipal(object idProduto)
        {
            var listaImagens = NServico.Db.Imagems.Where(i => i.IdProduto == int.Parse(idProduto.ToString())).ToList();
            string nomeImagem;
            if (listaImagens.Count > 0)
            {
                Imagem im = (listaImagens.Where(ii => ii.Principal).Count() > 0)
                                ? listaImagens.FirstOrDefault(ii => ii.Principal)
                                : listaImagens[0];

                nomeImagem = im.Nome;
            }
            else
            {
                nomeImagem = "noproduct.jpg";
            }

            const string sFileDir = "Imagem/produtos/";

            if (File.Exists(Server.MapPath(sFileDir + nomeImagem)))
            {
                return sFileDir + nomeImagem;
            }
            
            return "Imagem/noproduct.jpg";
        }

        #endregion


        #endregion

        protected void CadastrarEmailNewsClick(object sender, EventArgs e)
        {
            #region Validacoes

            if (string.IsNullOrWhiteSpace(tbEmailNews.Text))
            {
                ExibirMensagem(TipoMensagem.Error, "Email é Obrigatório.");
                tbEmailNews.SetCssClassError();
                return;
            }

            const string email = @"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$";
            Match match = Regex.Match(tbEmailNews.Text, email);
            if (!match.Success)
            {
                ExibirMensagem(TipoMensagem.Error,"Email inválido.");
                tbEmailNews.SetCssClassError();
                return;
            }

            #endregion

            if (NServico.Db.NewsLetters.Count(l => l.Email == tbEmailNews.Text) == 0)
            {

                using (var tScope = new TransactionScope(TransactionScopeOption.Required))
                {
                    NewsLetter nl = new NewsLetter();
                    nl.Email = tbEmailNews.Text;
                    NServico.Db.NewsLetters.InsertOnSubmit(nl);
                    NServico.Db.SubmitChanges(ConflictMode.FailOnFirstConflict);
                    tScope.Complete();
                }

            }
            tbEmailNews.Text = string.Empty;
            ExibirMensagem(TipoMensagem.Success, "Email cadastrado com sucesso.");

        }
    }
}